<?php

/**
 * Recebe uma lista de elementos e os coloca de forma aninhada.
 *
 * @param array $lista       Lista de elementos a ser aninhada
 * @param string $chave      Indice que contem o valor padrao (codcategoria, por exemplo)
 * @param string $chavePai   Indice que contem o valor do codigo pai (codpai, por exemplo)
 * @param string $propFilhos Novo indice a ser gerado que armazenara os elementos aninhados
 * @return array Lista com os elementos aninhados
 * @author Hugo Ferreira da Silva
 */
function fncAninharElementos(array $lista, $chave, $chavePai, $propFilhos = '_filhos') {

    // 1 - colocando os itens indexados pelo codigo principal
    $tmp = array();
    foreach ($lista as $item) {
        $tmp[$item[$chave]] = $item;
    }

    // 2 - colocando um item dentro do outro,
    // conforme pais e filhos
    /* foreach($tmp as &$item){
      if(!empty($item[$chavePai])){
      $tmp[$item[$chavePai]][$propFilhos][] = &$item;
      }
      } */

    // 3 - deixando somente os itens que nao tem pai
    $nova = array();
    foreach ($tmp as $node) {
        //if(empty($node[$chavePai])){
        $nova[] = $node;
        //}
    }

    // pronto, retornando os elementos
    return $nova;
}

/**
 * Função para gerar um HTML a partir de um modelo de uma lista aninhada
 *
 * @param array $lista Lista de elementos aninhados
 * @param string $tpl Modelo para aplicar as substituições
 * @param string $nomeIndice Nome do indice do array que contém elementos filhos
 * @param string $indentString String usada para indentação
 * @param int $level Nivel atual do laço
 * @return Ambigous <string, mixed>
 * @author Hugo Ferreira da Silva
 */
function fncImprimeConteudoAninhado(array $lista, $tpl, $nomeIndice, $indentString = ' ', $level = 0, $strAbertura = '', $strFechamento = '') {
    $str = '';
    foreach ($lista as $item) {
        $item['_indent'] = str_repeat($indentString, $level);

        $str .= preg_replace('@:(\w+)\b@e', 'isset($item["$1"]) ? $item["$1"] : ":$1"', $tpl);

        if (!empty($item[$nomeIndice])) {
            $filho = $strAbertura;
            $filho .= fncImprimeConteudoAninhado($item[$nomeIndice], $tpl, $nomeIndice, $indentString, $level + 1, $strAbertura, $strFechamento);
            $filho .= $strFechamento;

            if (strpos($str, ':_conteudoFilho') !== false) {
                $str = str_replace(':_conteudoFilho', $filho, $str);
            } else {
                $str .= $filho;
            }
        }

        // tirando o lixo
        $str = preg_replace('@:(\w+)\b@', '', $str);
    }

    return $str;
}

function echoVarDump($varEcho) {
    echo "<pre>";
    var_dump($varEcho);
    echo "</pre>";
}

function getTimestamp() {
    return mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y"));
}

function getDatetimeNow() {
    return new \DateTime("now");
}

function populateForm($obj, $post, $arrayNotInclude = null) {
    if ($arrayNotInclude != null) {
        foreach ($post as $field => $val) {
            if (property_exists(get_class($obj), $field)) {
                //if(!in_array($field, $arrayNotInclude)) {
                $field = "set_" . $field;
                $obj->$field($val);
            }
        }
    } else {
        foreach ($post as $field => $val) {
            if (property_exists(get_class($obj), $field)) {
                $field = "set_" . $field;
                $obj->$field($val);
            }
        }
    }
}

function getOrgaosExpeditores() {
    return array(
        array('sigla' => "SSP", 'nome' => "Secretaria de Segurança Pública"),
        array('sigla' => "PM", 'nome' => "Polícia Militar"),
        array('sigla' => "PC", 'nome' => "Policia Civil"),
        array('sigla' => "CNT", 'nome' => "Carteira Nacional de Habilitação"),
        array('sigla' => "DIC", 'nome' => "Diretoria de Identificação Civil"),
        array('sigla' => "CTPS", 'nome' => "Carteira de Trabaho e Previdência Social"),
        array('sigla' => "FGTS", 'nome' => "Fundo de Garantia do Tempo de Serviço"),
        array('sigla' => "IFP", 'nome' => "Instituto Félix Pacheco"),
        array('sigla' => "IPF", 'nome' => "Instituto Pereira Faustino"),
        array('sigla' => "IML", 'nome' => "Instituto Médico-Legal"),
        array('sigla' => "MTE", 'nome' => "Ministério do Trabalho e Emprego"),
        array('sigla' => "MMA", 'nome' => "Ministério da Marinha"),
        array('sigla' => "MAE", 'nome' => "Ministério da Aeronáutica"),
        array('sigla' => "MEX", 'nome' => "Ministério do Exército"),
        array('sigla' => "POF", 'nome' => "Polícia Federal"),
        array('sigla' => "POM", 'nome' => "Polícia Militar"),
        array('sigla' => "SES", 'nome' => "Carteira de Estrangeiro"),
        array('sigla' => "SJS", 'nome' => "Secretaria da Justiça e Segurança"),
        array('sigla' => "SJTS", 'nome' => "Secretaria da Justiça do Trabalho e Segurança"),
        array('sigla' => "ZZZ", 'nome' => "Outros (inclusive exterior)")
    );
}

function objectToArray($object) {
    $arr = array();
    for ($i = 0; $i < count($object); $i++) {
        $arr[] = get_object_vars($object[$i]);
    }
    return $arr;
}

function acento_retira($string) {
    $palavra = strtr($string, "áàãâéêíóôõúüçÁÀÃÂÉÊÍÓÔÕÚÜÇ ", "aaaaeeiooouucAAAAEEIOOOUUC_");
    $palavranova = str_replace("_", " ", $palavra);
    return $palavranova;
}

function isEdicao($id_objeto) {
    return $id_objeto != null && $id_objeto != '';
}

function formataExclusao($id, $id_data_table) {
    return "<span class=\"botaoExcluir\" id=\"dataTableContent_" . $id_data_table . "_" . $id . "\">Excluir</span>";
}

function isNotBlank($valor) {
    return $valor != null && $valor != '';
}

/*
 * Função pra codificar o valor e salvar em banco.
 * @param $valor no formato 9.999,99
 * @returns $valor codificado no formato 9999.99
 */

function valorFloatEncode($valor) {
    $valor_formatado = str_replace(".", "", $valor);
    return str_replace(",", ".", $valor_formatado);
}

/*
 * Função pra decodificar o valor obtido de banco e mostrá-lo em tela.
 * @param $valor no formato 9999.99
 * @returns $valor decodificado no formato 9.999,99
 */

function valorFloatDecode($valor) {
    $valor_formatado = str_replace(".", ",", $valor);
    return substr($valor_formatado, 0, 1) . "." . substr($valor_formatado, 1);
}

function criptografaSenha($senha) {
    return md5($senha);
}

/*
 * Converte uma data no formato 99/99/9999 para 9999-99-99
 */

function dataToDate($data) {
    if (isNotBlank($data)) {
        $hora = explode(" ", $data);
        $explode = explode("/", $hora[0]);
        if (count($explode) == 3) {
            $retorno = $explode[2] . "-" . $explode[1] . "-" . $explode[0];
            if (count($hora) > 1) {
                $retorno .= " " . $hora[1];
            }
            return $retorno;
        }
    }
    return $data;
}

function dateTimeToData($dateTime) {
    return date("d/m/Y", strtotime($dateTime));
}

/*
 * Converte uma data no formato 9999-99-99 para 99/99/9999
 */

function dateToData($date) {
    if (isNotBlank($date)) {
        $hora = explode(" ", $date);
        $explode = explode("-", $hora[0]);
        if (count($explode) == 3) {
            $retorno = $explode[2] . "/" . $explode[1] . "/" . $explode[0];
            if (count($hora) > 1) {
                $retorno .= " " . $hora[1];
            }
            return $retorno;
        }
    }
    return $date;
}

function getOffsetPaginacao($page) {
    return ( $page - 1 ) * LIMITE_PAGINACAO_ADMIN;
}

function pesquisaHabilitada($pesquisa) {
    return isNotBlank($pesquisa) && $pesquisa === TRUE;
}

function required($fieldName) {
    return str_replace("#field", $fieldName, MSG_REQUIRED);
}

if (!function_exists('get_value')) {

    function get_value($entity, $field) {
        return $entity != null ? $entity->get_ . (string) $field : '';
    }

}

if (!function_exists('get_date_extended')) {

    function get_date_extended($date) {
        // leitura das datas
        $dia = $date->format('d');
        $mes = $date->format('m');
        $ano = $date->format('Y');

        switch ($mes) {

            case 1: $mes = "Janeiro";
                break;
            case 2: $mes = "Fevereiro";
                break;
            case 3: $mes = "Março";
                break;
            case 4: $mes = "Abril";
                break;
            case 5: $mes = "Maio";
                break;
            case 6: $mes = "Junho";
                break;
            case 7: $mes = "Julho";
                break;
            case 8: $mes = "Agosto";
                break;
            case 9: $mes = "Setembro";
                break;
            case 10: $mes = "Outubro";
                break;
            case 11: $mes = "Novembro";
                break;
            case 12: $mes = "Dezembro";
                break;
        }
        return "$dia de $mes de $ano";
    }
    
    if (!function_exists('has_user_fb')) {
        function has_user_fb() {
            return isset($_SESSION[USER_FB]) && $_SESSION[USER_FB];
        }
    }
    
    if (!function_exists('get_name_user_fb')) {
        function get_name_user_fb() {
            return has_user_fb() ? $_SESSION[USER_FB]->name : '';
        }
    }
    
    if (!function_exists('get_user_fb')) {
        function get_user_fb() {
            return has_user_fb() ? $_SESSION[USER_FB] : null;
        }
    }
    
    if (!function_exists('get_fb_id')) {
        function get_fb_id() {
            return has_user_fb() ? $_SESSION[USER_FB]->id : null;
        }
    }

}
